3、GitLAB&Jenkins
GitLAB & Jenkins
目录
[toc]
实践:基于Jenkins提交流水线(测试成功)-2023.4.25
目的:掌握通过触发器将GitLab和Jenkins集成,实现提交流水线。
1、触发Jenkins构建
安装Generic Webhook Trigger
插件
重启后,进入一个Pipeline项目设置,已经可以选择这个触发器了....
插件文档:https://plugins.jenkins.io/generic-webhook-trigger/
Jenkins作业配置触发器
启动Generic Webhook触发器后, 相当于给Jenkins加了一个新的接口(http://JENKINS_URL/generic-webhook-trigger/invoke)。
调用的时候:这里要把 JENKINS_URL
换成自己真实的Jenkins 服务器地址,有端口就加上端口,是域名就写域名。下面是一个参考的URL:
http://192.168.1.200:8080/generic-webhook-trigger/invoke
Post content parameters: 获取调用接口传进来的数据
JsonPath语法文档: https://github.com/json-path/JsonPath
Header parameters: 获取Header中的参数
Request parameters: 获取URL中的请求参数
curl http://192.168.1.200:8080/generic-webhook-trigger/invoke?runopts=gitlab
Token: 给URL添加一个触发的认证
curl http://192.168.1.200:8080/generic-webhook-trigger/invoke?token=devops-service
打印调试信息到日志中
触发条件过滤:仅满足条件才能触发此作业
创建测试项目
- 创建一个叫做
devops-demo-service
的jenkins作业(这里的作业名称和gitlab里的项目名称推荐保持一致)
- 要加一个唯一的token,不然会触发所有token一样的项目
- 把这2个选项勾选上
- 此时在postman里测试触发
触发url http://172.29.9.101:8080/generic-webhook-trigger/invoke?token=devops-demo-service
这里记得要加一个basic auth
:
可以看到触发成功了。
- 演示将postman中的请求转换curl方式。
curl --location --request POST 'http://172.29.9.101:8080/generic-webhook-trigger/invoke?token=devops-demo-service' \
--header 'Authorization: Basic YWRtaW46YWRtaW4='
可以看到,也是能构建成功的。
解析GET/POST请求数据
传参注意,第一个参数使用?号连接, 后面的参数使用&符号连接。
?token=demo-pipeline-service&user=jenkins&a=1&b=2
解析GET数据
- 客户端发送Get请求, 带有两个参数
version
和username
。
http://172.29.9.101:8080/generic-webhook-trigger/invoke?token=devops-demo-service&version=1.1.1&username=jenkins
- Jenkins 配置Generic hook,获取请求参数
version
和username
(参数名称要一致)
- 验证测试(Jenkins日志中能够打印出获取的值,则正常)
这里简单写一个pipeline把。
可以看到效果了。
- 通过jenkinsfile读取传递的参数,再次触发
currentBuild.displayName = "${version}"
println("${version}")
println("${username}")
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
再次postman触发,观察效果:(符合预期)
解析HEADER参数数据
- 客户端发送请求(什么请求都可以,这里的header与请求类型无关), 带有两个参数 devops和 tool-name。
- Jenkins 配置Generic hook,获取请求参数devops和 tool-name 。
- 通过jenkinsfile读取传递的参数
注意,这里的pipeline代码如果打印tool-name
变量的话,会报错的
这里要使用下划线来替换横杠:
再次触发,就正常了,符合预期。
解析POST数据
- 客户端发送POST请求, 参数存储在body体中(参考POSTMAN中的样例)
- Jenkins 配置触发器来获取Post参数。
删除之前测试的header参数,request参数。
$
代表/,获取所有数据
获取name字段
- Jenkinsfile中使用参数
触发:
验证:
扩展流水线解析JSON数据
- 安装插件:
Pipeline Utility Steps
- readJSON: 处理json数据
currentBuild.displayName = "${name}"
println("${Data}")
NewData = readJSON text: "${Data}"
envName = NewData["envName"]
appsName = NewData["apps"]["name"]
pipeline {
agent any
stages {
stage('Hello') {
steps {
script {
println("${envName}")
println("${appsName}")
}
}
}
}
}
再次构建:
验证:(符合预期)
Rebuilder
插件使用
可以直接携带原触发参数进行触发,不用重复触发(不用在重复的提交代码了)。
进入某一次构建后,可以点击rebuild。
2、获取触发参数
1.触发器配置
Jenkins开启trigger
目的: 开启trigger后,就可以实现其他系统通过一个指定的URL进行自动触发构建了;
新建一个文件夹存放对应GitLab仓库组中的流水线。这里建议用仓库组的名称作为文件夹的名称devops03
;
用Gitlab项目名称与流水线命名; devops03-demo-service
项目;
- 开启Generic webhook;
- 配置触发Token,例如:作业名称
devops03-demo-service
(这个token是流水线触发需要传递的); - 生成的触发URL;
http://192.168.1.200:8080/generic-webhook-trigger/invoke?token=devops03-demo-service
(此时,已经生成了触发URL,接着可以使用Curl或者Postman进行触发测试了!)
自己本次的这部分配置已经配置完成了。
- 这里还原下,删除之前的变量,这里只保留Data。
- 修改下pipeline代码
println("${Data}")
NewData = readJSON text: "${Data}"
// envName = NewData["envName"]
// appsName = NewData["apps"]["name"]
println("${NewData}")
pipeline {
agent any
stages {
stage('Hello') {
steps {
script {
println("${NewData}")
}
}
}
}
}
配置GitLab WebHook
进入GitLab项目设置, 进入 webhook
配置页面;
-
配置要触发的URL,即Jenkins触发器接口URL;
-
选择发生哪种GitLab事件后触发此Webhook;例如:Push提交代码、Tag创建标签等等;
-
在gitlab的项目里配置好webhook
http://172.29.9.101:8080/generic-webhook-trigger/invoke?token=devops-demo-service
事件:
-
Push 提交事件
-
Tag Push 创建事件
-
MergeRequest 合并事件
-
Issue 问题创建更新事件
-
测试模拟触发
模拟事件触发,点击test按钮选择push事件,此时去看下Jenkins是否成功被触发。
这里稍微测试下:
点击Test
触发成功则提示: Hook executed successfully: HTTP 200, 此时可以看下Jenkins是否已经触发了一次构建;